package com.leetcode.divide;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Dennis Li
 * @date 2020/7/29 20:58
 */
public class DiffWaysToCompute_241 {

    public List<Integer> diffWaysToCompute(String input) {
        List<Integer> ways = new ArrayList<>();
        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);
            if (c == '+' || c == '-' || c == '*') {
                // 分别去计算左右两个式子的值，获得左右式子的所有结果，然后根据式子再分别进行计算
                List<Integer> left = diffWaysToCompute(input.substring(0, i));
                List<Integer> right = diffWaysToCompute(input.substring(i + 1));
                for (int l : left) {
                    for (int r : right) {
                        switch (c) {
                            case '+':
                                ways.add(l + r);
                                break;
                            case '-':
                                ways.add(l - r);
                                break;
                            case '*':
                                ways.add(l * r);
                                break;
                        }
                    }
                }
            }
        }
        if (ways.size() == 0) {
            ways.add(Integer.valueOf(input));
        }
        return ways;
    }

    public List<Integer> diffWaysToCompute2(String input) {
        List<Integer> list = new ArrayList<>();

        for (int i = 0; i < input.length(); i++) {
            char ch = input.charAt(i);
            if (ch == '*' || ch == '+' || ch == '-') {
                List<Integer> left = diffWaysToCompute2(input.substring(0, i));
                List<Integer> right = diffWaysToCompute2(input.substring(i + 1));
                for (int l : left) {
                    for (int r : right) {
                        switch (ch) {
                            case '*':
                                list.add(l * r);
                                break;
                            case '+':
                                list.add(l + r);
                                break;
                            case '-':
                                list.add(l - r);
                                break;
                        }
                    }
                }
            }
        }

        if (list.size() == 0) {
            // 说明内部没有操作符，只有数字，因此加入这个数字
            list.add(Integer.valueOf(input));
        }

        return list;
    }

}
